Course of direction per edge.

Analysis

All points.

By hour

General

 df_superhotedges_april16pt %>% 
    merge(y = df_osm_edge_ids , using = way_id) %>% 
    ggplot(aes(x= track, fill = factor(address))) + 
    geom_histogram(binwidth = 45) +
    facet_wrap(~type) +
    scale_x_continuous(breaks = seq(0,400,45))+ 
    ggtitle("Track histogram by type of street") 

dens2 <-df_superhotedges_april16pt %>% 
  merge(y = df_osm_edge_ids, using = way_id) %>% 
  ggplot(aes(x= track)) +
  geom_density(aes(group=factor(address), color=address)) + 
  ggtitle("Track density group by street type(WW)") + 
  xlab("Grades(º)") +
  ylab("Density") +
  facet_wrap(~type)
ggplotly(dens2)  
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used
[[1]]

dens_hr2 <- function(index) {  df_superhotedges_april16pt %>% 
  filter( way_id == df_osm_edge_ids[index,1] ) %>% 
  merge(y = df_osm_edge_ids, using = way_id) %>% 
  ggplot(aes(x= track)) +
  geom_density(aes(group=factor(hour(time)), color=factor(hour(time)))) + 
  ggtitle(paste("Track density by edge and hour (WW)",df_osm_edge_ids[index,2],df_osm_edge_ids[index,1], sep = " " )) + 
  xlab("Grades(º)") +
  ylab("Density") 
          
}
lapply(1:7, FUN = dens_hr2)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

dens_hr4 <- function(index) { df_superhotedges_april16pt %>% 
  filter(way_id == df_osm_edge_ids[index,1]) %>% 
  ggplot(aes(x=time, y = track, color = factor(session_id))) + 
  geom_point() + 
  ggtitle(paste("Tracks",df_osm_edge_ids[index,2],df_osm_edge_ids[index,1], sep = " " )) + 
  geom_hline(aes(yintercept = 90)) + 
  geom_hline(aes(yintercept = 180)) +
  geom_hline(aes(yintercept = 270)) +
  theme(legend.position="none")+ 
  ggtitle(paste("Track points by edge and session(WW)",df_osm_edge_ids[index,2],df_osm_edge_ids[index,1], sep = " " )) + 
  xlab("date") +
  ylab("track(º)") 
          
}
lapply(1:7, FUN = dens_hr4)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

dens_hr5 <- function(index) {df_superhotedges_april16pt %>% 
  filter(way_id == df_osm_edge_ids[index,1]) %>% 
  ggplot(aes(x=factor(session_id), y=track, color= factor(segment_id))) +
  geom_boxplot(outlier.shape = NA)+ 
  ggtitle(paste("Tracks",df_osm_edge_ids[index,2],df_osm_edge_ids[index,1], sep = " " )) + 
  geom_hline(aes(yintercept = 90)) + 
  geom_hline(aes(yintercept = 180)) +
  geom_hline(aes(yintercept = 270)) +
  theme(legend.position="none")+ 
  ggtitle(paste("Median of the track by session and segments",df_osm_edge_ids[index,2],df_osm_edge_ids[index,1], sep = " " )) + 
  xlab("Grades(º)") +
  ylab("Density") 
          
}
lapply(1:7, FUN = dens_hr5)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

With the way

dens_hr3 <- function(index) {  df_superhotedges_april16pt %>% 
  filter( way_id == df_osm_edge_ids[index,1]) %>% 
  merge(y = df_osm_edge_ids, using = way_id) %>% 
  ggplot(aes(x= track)) +
  geom_density(aes(group=factor(course), color=factor(course))) + 
  ggtitle(paste("Track density by edge and course (WW)",df_osm_edge_ids[index,2],df_osm_edge_ids[index,1], sep = " " )) + 
  xlab("Grades(º)") +
  ylab("Density") 
          
}
lapply(1:7, FUN = dens_hr3)
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

longer object length is not a multiple of shorter object lengthlonger object length is not a multiple of shorter object length

LS0tCnRpdGxlOiAiUHJlIEFuYWx5c2lzIHRvcCA3IGVkZ2VzOiBkZWNpZGluZyB0aGUgY291cnNlLiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBDb3Vyc2Ugb2YgZGlyZWN0aW9uIHBlciBlZGdlLgpgYGB7ciBlY2hvPUZBTFNFfQojIEFkZGluZyBjb3Vyc2UgdG8gdGhlIHRvcCA3IGVkZ2VzLiAKCiAKZGZfc3BlZWRfdG9wJGNvdXJzZSA8LSAxCmludGVyc2VjdGlvbiA8LSA0MS4xNzc1NQoKI1ZlcnRpY2FsCiNSdWEgUm9iZXJ0byBGcmlhcyAxICYgRWR1YXJkbyBTaWx2YSAxCmRmX3NwZWVkX3RvcFsoKGRmX3NwZWVkX3RvcCR3YXlfaWQgPT0gMzcxNDE5NzAgJiBkZl9zcGVlZF90b3AkbGF0IDwgaW50ZXJzZWN0aW9uKSB8IGRmX3NwZWVkX3RvcCR3YXlfaWQgPT0gMzUxNDU1MjEgKSAmCiAgICAgICAgICAgICAgICAgKGF2ZShkZl9zcGVlZF90b3AkdHJhY2ssZGZfc3BlZWRfdG9wJHNlc3Npb25faWQgLCBkZl9zcGVlZF90b3Akc2VnbWVudF9pZCwgRlVOID0gbWVkaWFuICkpID4gOTAgJgogICAgICAgICAgICAgICAgICAgIChhdmUoZGZfc3BlZWRfdG9wJHRyYWNrLGRmX3NwZWVkX3RvcCRzZXNzaW9uX2lkICwgZGZfc3BlZWRfdG9wJHNlZ21lbnRfaWQsIEZVTiA9IG1lZGlhbiApKSA8IDI3MCxdJGNvdXJzZSA8LSAyCgojUnVhIFJvYmVydG8gRnJpYXMgMiAmIEVkdWFyZG8gU2lsdmEgMgpkZl9zcGVlZF90b3BbKChkZl9zcGVlZF90b3Akd2F5X2lkID09IDM3MTQxOTcwICYgZGZfc3BlZWRfdG9wJGxhdCA+IGludGVyc2VjdGlvbikgfCBkZl9zcGVlZF90b3Akd2F5X2lkID09IDMxNjQ1OTE2OSkgJiAoYXZlKGRmX3NwZWVkX3RvcCR0cmFjayxkZl9zcGVlZF90b3Akc2Vzc2lvbl9pZCAsIGRmX3NwZWVkX3RvcCRzZWdtZW50X2lkLCBGVU4gPSBtZWRpYW4gKSA8IDkwKSB8IChhdmUoZGZfc3BlZWRfdG9wJHRyYWNrLGRmX3NwZWVkX3RvcCRzZXNzaW9uX2lkICwgZGZfc3BlZWRfdG9wJHNlZ21lbnRfaWQsIEZVTiA9IG1lZGlhbiApID4gMjcwKSxdJGNvdXJzZSA8LSAyICAKICAgICAgICAgICAgICAgCgojSG9yaXpvbnRhbHMKI1J1YSBILiBTb3VzYSAxICYgSC4gU291c2EgMiAKZGZfc3BlZWRfdG9wWyhkZl9zcGVlZF90b3Akd2F5X2lkID09IDYzMTkyNTI1IHwgZGZfc3BlZWRfdG9wJHdheV9pZCA9PSAxMDYzMzQ4NTEpICYgICAoYXZlKGRmX3NwZWVkX3RvcCR0cmFjayxkZl9zcGVlZF90b3Akc2Vzc2lvbl9pZCAsIGRmX3NwZWVkX3RvcCRzZWdtZW50X2lkLCBGVU4gPSBtZWRpYW4gKSkgPCAxODAsXSRjb3Vyc2UgPC0gMgoKI1J1YSBNYW51ZWwgU2lsdmEuIApkZl9zcGVlZF90b3BbZGZfc3BlZWRfdG9wJHdheV9pZCA9PSAzNTA3ODUwMCAgJiAoYXZlKGRmX3NwZWVkX3RvcCR0cmFjayxkZl9zcGVlZF90b3Akc2Vzc2lvbl9pZCAsIGRmX3NwZWVkX3RvcCRzZWdtZW50X2lkLCBGVU4gPSBtZWRpYW4gKSA+IDE4MCksXSRjb3Vyc2UgPC0gMgoKIyBSdWEgZGUgRnJlaSAKZGZfc3BlZWRfdG9wIDwtIGRmX3NwZWVkX3RvcCAlPiUgCiAgbXV0YXRlKCBoZWFkaW5nID0gY2FzZV93aGVuKCh3YXlfaWQgPT0gMzcxNDE5NzAgfCB3YXlfaWQgPT0gMzUxNDU1MjEpICYgIGNvdXJzZSA9PSAyIH4gIlMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdheV9pZCA9PSAzNzE0MTk3MCB8IHdheV9pZCA9PSAzNTE0NTUyMSkgJiAgY291cnNlID09IDEgfiAiTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXlfaWQgPT0gMzcxNDE5NzAuMiB8IHdheV9pZCA9PSAzMTY0NTkxNjkpICYgIGNvdXJzZSA9PSAyIH4gIk4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdheV9pZCA9PSAzNzE0MTk3MC4yIHwgd2F5X2lkID09IDMxNjQ1OTE2OSkgJiAgY291cnNlID09IDEgfiAiUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXlfaWQgPT0gNjMxOTI1MjUgfCB3YXlfaWQgPT0gMTA2MzM0ODUxKSAmICBjb3Vyc2UgPT0gMiB+ICJFIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXlfaWQgPT0gNjMxOTI1MjUgfCB3YXlfaWQgPT0gMTA2MzM0ODUxKSAmICBjb3Vyc2UgPT0gMSB+ICJXIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F5X2lkID09IDM1MDc4NTAwICAmICBjb3Vyc2UgPT0gMiB+ICJXIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdheV9pZCA9PSAzNTA3ODUwMCAgJiAgY291cnNlID09IDEgfiAiRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdheV9pZCA9PSAzNzE0MTk2NyAgJiAgKGF2ZShkZl9zcGVlZF90b3AkdHJhY2ssZGZfc3BlZWRfdG9wJHNlc3Npb25faWQgLCBkZl9zcGVlZF90b3Akc2VnbWVudF9pZCwgRlVOID0gbWVkaWFuICkgPiAxODApIH4gIlciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXlfaWQgPT0gMzcxNDE5NjcgICYgIChhdmUoZGZfc3BlZWRfdG9wJHRyYWNrLGRmX3NwZWVkX3RvcCRzZXNzaW9uX2lkICwgZGZfc3BlZWRfdG9wJHNlZ21lbnRfaWQsIEZVTiA9IG1lZGlhbiApIDwgMTgwKSB+ICJFIikpIAoKYGBgCgoKI0FuYWx5c2lzIAoKIyMjIEFsbCBwb2ludHMuIApgYGB7ciBlY2hvPUZBTFNFfQp0c2VyaWVzX2xpZ2h0MiA8LSBmdW5jdGlvbihpbmRleCkgeyBkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgICBmaWx0ZXIoIHdheV9pZCA9PSBkZl9vc21fZWRnZV9pZHNbaW5kZXgsMV0gKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9IHRpbWUsIHk9IChzcGVlZCoxOCkvNSkpICsgCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBmYWN0b3IoY291cnNlKSksIGFscGhhID0gMS8xMCkgKyAKICAgIHlsYWIoIlNwZWVkKGttL2gpIikgKyAKICAgIHhsYWIoIkRhdGUiKSsgCiAgICBnZ3RpdGxlKHBhc3RlKCJUaW1lIHNlcmllcyBvZiBzcGVlZCBmb3Igd2F5X2lkOiIsZGZfb3NtX2VkZ2VfaWRzW2luZGV4LDJdLGRmX29zbV9lZGdlX2lkc1tpbmRleCwxXSwgc2VwID0gIiAiICkpfQoKbGFwcGx5KDEsIEZVTiA9IHRzZXJpZXNfbGlnaHQyKQpgYGAKCiMjIyBCeSBob3VyCmBgYHtyIGVjaG89RkFMU0V9CmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBob3VyKHRpbWUpLCB5PSB0cmFjaykpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBjb3Vyc2UpLCBhbHBoYSA9IDEvMTAwKSArCiAgZmFjZXRfd3JhcCh+IHdheV9pZCkKYGBgCgojIyBHZW5lcmFsIAoKYGBge3J9CiBkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgICBtZXJnZSh5ID0gZGZfb3NtX2VkZ2VfaWRzICwgdXNpbmcgPSB3YXlfaWQpICU+JSAKICAgIGdncGxvdChhZXMoeD0gdHJhY2ssIGZpbGwgPSBmYWN0b3IoYWRkcmVzcykpKSArIAogICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA0NSkgKwogICAgZmFjZXRfd3JhcCh+dHlwZSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDQwMCw0NSkpKyAKICAgIGdndGl0bGUoIlRyYWNrIGhpc3RvZ3JhbSBieSB0eXBlIG9mIHN0cmVldCIpIAoKYGBgCgoKCmBgYHtyIGVjaG89RkFMU0V9CmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICAgIG1lcmdlKHkgPSBkZl9vc21fZWRnZV9pZHMgLCB1c2luZyA9IHdheV9pZCkgJT4lIAogICAgc3Vic2V0KHdheV9pZCA9PSAzNTE0NTUyMSkgJT4lIAogICAgZ2dwbG90KGFlcyh4PSB0cmFjaykpICsgCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDQ1KSArCiAgICBmYWNldF93cmFwKH5mYWN0b3IoaG91cih0aW1lKSkpIApgYGAKCmBgYHtyfQpkZW5zMiA8LWRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBtZXJnZSh5ID0gZGZfb3NtX2VkZ2VfaWRzLCB1c2luZyA9IHdheV9pZCkgJT4lIAogIGdncGxvdChhZXMoeD0gdHJhY2spKSArCiAgZ2VvbV9kZW5zaXR5KGFlcyhncm91cD1mYWN0b3IoYWRkcmVzcyksIGNvbG9yPWFkZHJlc3MpKSArIAogIGdndGl0bGUoIlRyYWNrIGRlbnNpdHkgZ3JvdXAgYnkgc3RyZWV0IHR5cGUoV1cpIikgKyAKICB4bGFiKCJHcmFkZXMowropIikgKwogIHlsYWIoIkRlbnNpdHkiKSArCiAgZmFjZXRfd3JhcCh+dHlwZSkKCmdncGxvdGx5KGRlbnMyKSAgCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KZGVuczMgPC1kZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgbWVyZ2UoeSA9IGRmX29zbV9lZGdlX2lkcywgdXNpbmcgPSB3YXlfaWQpICU+JSAKICBnZ3Bsb3QoYWVzKHg9IHRyYWNrKSkgKwogIHNjYWxlX3lfY29udGludW91cyhjKDAsMC4xKSkrCiAgZ2VvbV9kZW5zaXR5KGFlcyhncm91cD1mYWN0b3IodHlwZSksIGNvbG9yPXR5cGUpKSArIAogIGdndGl0bGUoIlRyYWNrIGRlbnNpdHkgIGJ5IGhvdXIgKFdXKSIpICsgCiAgeGxhYigiR3JhZGVzKMK6KSIpICsKICB5bGFiKCIiKSArCiAgZmFjZXRfd3JhcCh+aG91cih0aW1lKSkgCgpnZ3Bsb3RseShkZW5zMykgIApgYGAKCmBgYHtyIGVjaG89RkFMU0V9CmRlbnNfaCA8LSAgZnVuY3Rpb24oaHIpIHsgCgpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgbWVyZ2UoeSA9IGRmX29zbV9lZGdlX2lkcywgdXNpbmcgPSB3YXlfaWQpICU+JSAKICBmaWx0ZXIoaG91cih0aW1lKSA9PSBociwgd2F5X2lkICE9IDMxNjQ1OTE2OSkgJT4lIAogIGdncGxvdChhZXMoeD0gdHJhY2spKSArCiAgZ2VvbV9kZW5zaXR5KGFlcyhncm91cD1mYWN0b3IoYWRkcmVzcyksIGNvbG9yPWFkZHJlc3MpKSArIAogIGdndGl0bGUoIkRlbnNpdHkgb2YgY291cnNlIGdyYWRlKFdXKSIpICsgCiAgeGxhYigiR3JhZGVzKMK6KSIpICsKICB5bGFiKCJEZW5zaXR5IikgCgp9CgpsYXBwbHkoOCwgRlVOID0gZGVuc19oKQpgYGAKCgpgYGB7cn0KZGVuc19ocjIgPC0gZnVuY3Rpb24oaW5kZXgpIHsgIGRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoIHdheV9pZCA9PSBkZl9vc21fZWRnZV9pZHNbaW5kZXgsMV0gKSAlPiUgCiAgbWVyZ2UoeSA9IGRmX29zbV9lZGdlX2lkcywgdXNpbmcgPSB3YXlfaWQpICU+JSAKICBnZ3Bsb3QoYWVzKHg9IHRyYWNrKSkgKwogIGdlb21fZGVuc2l0eShhZXMoZ3JvdXA9ZmFjdG9yKGhvdXIodGltZSkpLCBjb2xvcj1mYWN0b3IoaG91cih0aW1lKSkpKSArIAogIGdndGl0bGUocGFzdGUoIlRyYWNrIGRlbnNpdHkgYnkgZWRnZSBhbmQgaG91ciAoV1cpIixkZl9vc21fZWRnZV9pZHNbaW5kZXgsMl0sZGZfb3NtX2VkZ2VfaWRzW2luZGV4LDFdLCBzZXAgPSAiICIgKSkgKyAKICB4bGFiKCJHcmFkZXMowropIikgKwogIHlsYWIoIkRlbnNpdHkiKSAKICAgICAgICAgIAp9CgpsYXBwbHkoMTo3LCBGVU4gPSBkZW5zX2hyMikKYGBgCgoKCmBgYHtyfQpkZW5zX2hyNCA8LSBmdW5jdGlvbihpbmRleCkgeyBkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKHdheV9pZCA9PSBkZl9vc21fZWRnZV9pZHNbaW5kZXgsMV0pICU+JSAKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeSA9IHRyYWNrLCBjb2xvciA9IGZhY3RvcihzZXNzaW9uX2lkKSkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2d0aXRsZShwYXN0ZSgiVHJhY2tzIixkZl9vc21fZWRnZV9pZHNbaW5kZXgsMl0sZGZfb3NtX2VkZ2VfaWRzW2luZGV4LDFdLCBzZXAgPSAiICIgKSkgKyAKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gOTApKSArIAogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSAxODApKSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDI3MCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsgCiAgZ2d0aXRsZShwYXN0ZSgiVHJhY2sgcG9pbnRzIGJ5IGVkZ2UgYW5kIHNlc3Npb24oV1cpIixkZl9vc21fZWRnZV9pZHNbaW5kZXgsMl0sZGZfb3NtX2VkZ2VfaWRzW2luZGV4LDFdLCBzZXAgPSAiICIgKSkgKyAKICB4bGFiKCJkYXRlIikgKwogIHlsYWIoInRyYWNrKMK6KSIpIAogICAgICAgICAgCn0KCmxhcHBseSgxOjcsIEZVTiA9IGRlbnNfaHI0KQpgYGAKCgpgYGB7cn0KZGVuc19ocjUgPC0gZnVuY3Rpb24oaW5kZXgpIHtkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKHdheV9pZCA9PSBkZl9vc21fZWRnZV9pZHNbaW5kZXgsMV0pICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjdG9yKHNlc3Npb25faWQpLCB5PXRyYWNrLCBjb2xvcj0gZmFjdG9yKHNlZ21lbnRfaWQpKSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpKyAKICBnZ3RpdGxlKHBhc3RlKCJUcmFja3MiLGRmX29zbV9lZGdlX2lkc1tpbmRleCwyXSxkZl9vc21fZWRnZV9pZHNbaW5kZXgsMV0sIHNlcCA9ICIgIiApKSArIAogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSA5MCkpICsgCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDE4MCkpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gMjcwKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKyAKICBnZ3RpdGxlKHBhc3RlKCJNZWRpYW4gb2YgdGhlIHRyYWNrIGJ5IHNlc3Npb24gYW5kIHNlZ21lbnRzIixkZl9vc21fZWRnZV9pZHNbaW5kZXgsMl0sZGZfb3NtX2VkZ2VfaWRzW2luZGV4LDFdLCBzZXAgPSAiICIgKSkgKyAKICB4bGFiKCJHcmFkZXMowropIikgKwogIHlsYWIoIkRlbnNpdHkiKSAKICAgICAgICAgIAp9CgpsYXBwbHkoMTo3LCBGVU4gPSBkZW5zX2hyNSkKYGBgCgojIyBXaXRoIHRoZSB3YXkKCmBgYHtyfQpkZW5zX2hyMyA8LSBmdW5jdGlvbihpbmRleCkgeyAgZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlciggd2F5X2lkID09IGRmX29zbV9lZGdlX2lkc1tpbmRleCwxXSkgJT4lIAogIG1lcmdlKHkgPSBkZl9vc21fZWRnZV9pZHMsIHVzaW5nID0gd2F5X2lkKSAlPiUgCiAgZ2dwbG90KGFlcyh4PSB0cmFjaykpICsKICBnZW9tX2RlbnNpdHkoYWVzKGdyb3VwPWZhY3Rvcihjb3Vyc2UpLCBjb2xvcj1mYWN0b3IoY291cnNlKSkpICsgCiAgZ2d0aXRsZShwYXN0ZSgiVHJhY2sgZGVuc2l0eSBieSBlZGdlIGFuZCBjb3Vyc2UgKFdXKSIsZGZfb3NtX2VkZ2VfaWRzW2luZGV4LDJdLGRmX29zbV9lZGdlX2lkc1tpbmRleCwxXSwgc2VwID0gIiAiICkpICsgCiAgeGxhYigiR3JhZGVzKMK6KSIpICsKICB5bGFiKCJEZW5zaXR5IikgCiAgICAgICAgICAKfQoKbGFwcGx5KDE6NywgRlVOID0gZGVuc19ocjMpCgpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIod2F5X2lkID09IGRmX29zbV9lZGdlX2lkc1ssMV0gKSAlPiUgCiAgZ2dwbG90KGFlcyh4PSB0cmFjaywgZmlsbCA9IGZhY3Rvcihjb3Vyc2UpKSkgKyAKICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNDUpICsKICBmYWNldF93cmFwKH5ob3VyKHRpbWUpKSsKICBnZ3RpdGxlKCJUcmFja3MgYnkgaG91ciBhbmQgY291cnNlIChXVykiKQpgYGAKCgo=